/*
 * @Author: mark
 * @Date: 2023-08-14 02:30:04
 * @LastEditors: mark
 * @LastEditTime: 2023-09-03 18:30:58
 * @FilePath: /自研/RuoYi_egg/ruoyi-egg/app/controller/system/sysUser.js
 * @Description:
 *
 * Copyright (c) 2023 by ${git_name_email}, All Rights Reserved.
 */
const Controller = require("egg").Controller;

// 定义请求接口的请求参数规则
const queryRule = {
  avatar: { type: "string", required: false },
  createBy: { type: "string", required: false },
  createTime: { type: "string", required: false },
  delFlag: { type: "string", required: false },
  deptId: { type: "string", required: false },
  email: { type: "string", required: false },
  loginDate: { type: "string", required: false },
  loginIp: { type: "string", required: false },
  nickName: { type: "string", required: false },
  password: { type: "string", required: false },
  phonenumber: { type: "string", required: false },
  remark: { type: "string", required: false },
  sex: { type: "string", required: false },
  status: { type: "string", required: false },
  updateBy: { type: "string", required: false },
  updateTime: { type: "string", required: false },
  userId: { type: "string", required: false },
  userName: { type: "string", required: false },
  userType: { type: "string", required: false },
};

/**
 * @Controller 用户信息
 */
class SysUserController extends Controller {
  /**
   * 普通分页查询
   * @param {*} ctx
   */
  /**
   * @summary 用户信息表查询  
   * @description 用户信息表查询  
   * @Router get /system/user/list
   * @request query string pageNum 页码 默认 1
   * @request query string pageSize 单页数量 默认 10
   * @request query string avatar 头像地址
   * @request query string createBy 创建者
   * @request query string createTime 创建时间
   * @request query string delFlag 删除标志（0代表存在 2代表删除）
   * @request query string deptId 部门ID
   * @request query string email 用户邮箱
   * @request query string loginDate 最后登录时间
   * @request query string loginIp 最后登录IP
   * @request query string nickName 用户昵称
   * @request query string password 密码
   * @request query string phonenumber 手机号码
   * @request query string remark 备注
   * @request query string sex 用户性别（0男 1女 2未知）
   * @request query string status 帐号状态（0正常 1停用）
   * @request query string updateBy 更新者
   * @request query string updateTime 更新时间
   * @request query string userId 用户ID
   * @request query string userName 用户账号
   * @request query string userType 用户类型（00系统用户）
   * @response 200 SystemUserList 操作成功
   */
  async list(ctx) {
    ctx.validate(queryRule, ctx.request.query);
    ctx.body = await ctx.service.system.sysUser.list(ctx.request.query);
    ctx.status = 200;
  }

  /**
   * 获取列表数据
   * @param {*} ctx
   */
  async allList(ctx) {
    ctx.body = await ctx.service.system.sysUser.allList(ctx.request.query);
    ctx.status = 200;
  }

  /**
   * 获取用户部门的数据
   * @param {*} ctx
   */
  async deptTree(ctx) {
    ctx.body = await ctx.service.system.sysDept.tree(ctx.request.query);
    ctx.status = 200;
  }

  /**
   * 删除
   * @param {*} ctx
   */
  /**
   * @summary 用户信息表删除  
   * @description 用户信息表删除  
   * @Router delete /system/user/{userId}
   * @response 200   操作成功
   */
  async delete(ctx) {
    ctx.body = await ctx.service.system.sysUser.delete(ctx.params.userId);
    ctx.status = 200;
  }

  /**
   * 更新
   * @param {*} ctx
   */
  /**
   * @summary 用户信息表修改  
   * @description 用户信息表修改  
   * @Router put /system/user
   * @response 200   操作成功
   */
  async update(ctx) {
    ctx.body = await ctx.service.system.sysUser.update(ctx.request.body);
    ctx.status = 200;
  }

  /**
   * 获取详情
   * @param {*} ctx
   */
  /**
   * @summary 用户信息表详情  
   * @description 用户信息表详情  
   * @Router get /system/user/{userId}
   * @request query string avatar 头像地址
   * @request query string createBy 创建者
   * @request query string createTime 创建时间
   * @request query string delFlag 删除标志（0代表存在 2代表删除）
   * @request query string deptId 部门ID
   * @request query string email 用户邮箱
   * @request query string loginDate 最后登录时间
   * @request query string loginIp 最后登录IP
   * @request query string nickName 用户昵称
   * @request query string password 密码
   * @request query string phonenumber 手机号码
   * @request query string remark 备注
   * @request query string sex 用户性别（0男 1女 2未知）
   * @request query string status 帐号状态（0正常 1停用）
   * @request query string updateBy 更新者
   * @request query string updateTime 更新时间
   * @request query string userId 用户ID
   * @request query string userName 用户账号
   * @request query string userType 用户类型（00系统用户）
   * @response 200   操作成功
   */
  async detail(ctx) {
    ctx.validate(queryRule, ctx.request.query);
    if (ctx.params.userId == "deptTree") {
      this.deptTree(ctx);
      return;
    }
    ctx.body = await ctx.service.system.sysUser.detail(
      ctx.params.userId ? ctx.params.userId : 0
    );
    ctx.status = 200;
  }

  /**
   * 重置密码
   */
  /**
   * @summary 用户重置密码  
   * @description 用户重置密码  
   * @Router put /system/user/resetPwd
   * @response 200   操作成功
   */
  async resetPwd(ctx) {
    ctx.body = await ctx.service.system.sysUser.resetPwd(ctx.request.body);
    ctx.status = 200;
  }

  /**
   * 创建
   * @param {*} ctx
   */
  /**
   * @summary 用户信息表新增  
   * @description 用户信息表新增  
   * @Router post /system/user
   * @response 200   操作成功
   */
  async create(ctx) {
    ctx.body = await ctx.service.system.sysUser.create(ctx.request.body);
    ctx.status = 200;
  }

  /**
   * @summary 用户信息下载  
   * @description 用户信息下载  
   * @Router post /system/user/export
   * @response 200   操作成功
   */
  async downLoad(ctx) {
    let data = await ctx.service.system.sysUser.allList(ctx.request.body);

    let downLoadModule = ctx.model.SysUser.fieldRawAttributesMap;
    let columnData = [];
    for (var key in downLoadModule) {
      columnData.push({
        header: downLoadModule[key].comment,
        key: ctx.underlineToHump(key),
        width: 15,
      });
    }
    if (data.code == 200) {
      await ctx.service.exportExcel.publicDownLoad(columnData, data.data);
    } else {
      ctx.body = data;
      ctx.status = 200;
    }
  }

  //查询用户角色信息
  /**
   * @summary 获取用户角色信息  
   * @description 获取用户角色信息  
   * @Router get /system/user/authRole/{userId}
   * @response 200 SystemUserAuthrole 操作成功
   */
  async getAuthRole(ctx) {
    let userId = ctx.params.userId;
    let userData = await ctx.service.system.sysUser.allList({
      userId,
    });
    let userRoles = await ctx.model.SysUserRole.findAll({
      where: {
        user_id: userId,
      },
      //返回时model还是json true表示json
      raw: false,
      include: [
        {
          model: ctx.model.SysRole,
        },
      ],
    });
    userRoles = userRoles.map((item) => {
      return ctx.objUnderlineToHump(item.dataValues.sys_role.dataValues);
    });
    let roleData = await ctx.service.system.sysRole.allList({});
    let roles = [];
    roleData.data.forEach((item2) => {
      if (item2.roleName != "超级管理员") {
        userRoles.forEach((element) => {
          if (element.roleId == item2.roleId) {
            item2.flag = true;
          }
        });
        roles.push(item2);
      }
    });
    ctx.body = {
      code: 200,
      msg: "操作成功",
      roles,
      user: Object.assign(userData.data[0], { roles: userRoles }),
    };
  }

  /**
   * 修改用户信息
   * @param {*} ctx
   */
  /**
   * @summary 修改用户角色信息  
   * @description 修改用户角色信息  
   * @Router put /system/user/authRole
   * @response 200   操作成功
   */
  /**
   * @summary 用户信息表修改  
   * @description 用户信息表修改  
   * @Router put /system/user
   * @response 200   操作成功
   */
  /**
   * @summary 修改用户角色信息  
   * @description 修改用户角色信息  
   * @Router put /system/user/authRole
   * @response 200   操作成功
   */
  async updateAuthRole(ctx) {
    let resData = [];
    if (ctx.query.userIds) {
      let roleId = ctx.query.roleId;
      let userIds = ctx.query.userIds.split(",");
      await ctx.service.system.sysUserRole.delete(roleId + "");
      for (let i of userIds) {
        resData.push(
          await ctx.service.system.sysUserRole.create({
            roleId,
            userId: i,
          })
        );
      }
    } else if (ctx.query.roleIds) {
      let roleIds = ctx.query.roleIds.split(",");
      let userId = ctx.query.userId;
      await ctx.service.system.sysUserRole.delete(userId + "");
      for (let i of roleIds) {
        resData.push(
          await ctx.service.system.sysUserRole.create({
            roleId: i,
            userId,
          })
        );
      }
    }

    resData = resData.filter((item) => item.code != 200);
    if (resData.length) {
      ctx.body =
        this.ctx.response.ServerResponse.createByErrorCodeMsgBusiness(10015);
    } else {
      ctx.body =
        this.ctx.response.ServerResponse.createBySuccessMsg("授权成功");
    }

    ctx.status = 200;
  }
}

module.exports = SysUserController;
